{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-b9592c5877cc>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From c:\\users\\yaorui_01\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From c:\\users\\yaorui_01\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./MNIST_data\\train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From c:\\users\\yaorui_01\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./MNIST_data\\train-labels-idx1-ubyte.gz\n",
      "Extracting ./MNIST_data\\t10k-images-idx3-ubyte.gz\n",
      "Extracting ./MNIST_data\\t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From c:\\users\\yaorui_01\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./MNIST_data\",one_hot=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 查看一下前16张图片\n",
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 定义输入和输出以及学习率，为之后的网络使用用于占位"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])   # 定义输入，batch的大小暂时没定，784是特征数，这里指一个图片的像素个数，28x28\n",
    "y = tf.placeholder(\"int64\", [None])  #定义输出，batch的大小暂时没定\n",
    "learning_rate = tf.placeholder(\"float\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 初始化权重，定义一个维度为shape，均值为0，标准差默认为0.1的数组，相当于把W和b的初始值用此程序给初始化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 初始化权重，定义一个维度为shape，均值为0，标准差默认为0.1的数组\n",
    "def initialize(shape, stddev=0.1):\n",
    "    return tf.truncated_normal(shape, stddev=stddev)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 设定一个两层的神经网络，第一层神经元的个数为100，第二层为10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设定第一层神经网络的个数\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))   # 初始化第一层神经网络的权重\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))  # 初始化第一层神经网络的偏置\n",
    "logits_1 = tf.matmul(x, W_1) + b_1  # 输入与权重的矩阵相差再加上偏置\n",
    "output_1 = tf.nn.relu(logits_1) # 把这一层的输出经过relu激活在输出到下一层\n",
    "\n",
    "L2_units_count = 10 # 第二层神经网络的个数，这里只定义了两层网络，第二层就需要做预测，10个输出对应的预测的10个数字\n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2 # 最终输出的原始数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 定义学习器，这里使用SGD学习器，使用交叉熵损失做验证，SGD就是每一次迭代计算mini-batch的梯度，然后对参数进行更新"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义交叉熵损失\n",
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "# 定义学习器，这里使用SGD学习器\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits) #经过softmax得到最终的概率分布\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)# 和正确的标签比较，得到哪些预测是正确的，tf.argmax(pred,1),代表每行行比较\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))# 先将correct_pred转换类型，再求平均值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32    # 定义一个batch大小\n",
    "trainig_step = 1000   # 训练次数\n",
    "\n",
    "saver = tf.train.Saver() #saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 创建session，在session里，把具体数值传入，进行训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.32965, the validation accuracy is 0.8794\n",
      "after 200 training steps, the loss is 0.476227, the validation accuracy is 0.9094\n",
      "after 300 training steps, the loss is 0.787848, the validation accuracy is 0.896\n",
      "after 400 training steps, the loss is 0.265342, the validation accuracy is 0.9264\n",
      "after 500 training steps, the loss is 0.198238, the validation accuracy is 0.9318\n",
      "after 600 training steps, the loss is 0.554047, the validation accuracy is 0.921\n",
      "after 700 training steps, the loss is 0.124163, the validation accuracy is 0.943\n",
      "after 800 training steps, the loss is 0.359438, the validation accuracy is 0.9454\n",
      "after 900 training steps, the loss is 0.359725, the validation accuracy is 0.945\n",
      "after 1000 training steps, the loss is 0.160514, the validation accuracy is 0.9532\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9496\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(1,trainig_step+1):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate:0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './myckpt/model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 使用保存的训练结果来进行预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./myckpt/model.ckpt-1000\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAd0AAAHiCAYAAACtERYWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3XeYFEX6B/Dvu4ElLDlLWqJEQVEMqIA5YcaEiPk8D3P4GTBn786cA+KJgVPMilkUDiUpokQVUMlBcliW3ff3R/V2dY0zu7M7M707u9/P8/Dw9lRNdffWdFd3VQdRVRAREVHqZVT0AhAREVUXbHSJiIhCwkaXiIgoJGx0iYiIQsJGl4iIKCRsdImIiELCRpeIiCgkad/oisitIlIgIptFpE6c3/lVRHaIyJgS8qiIbBGRu5K3tMknIjneuheIyJ0VvTyJYn1WrfoEWKdVoU5FZLRXH4vjzN/FW+dCETk/Rp6BIlLk5TsiqQscorLWb6VodL0FDv4rFJFHy1DEWFXNVdUtXnnjI8rbISI/FmdW1Y4A7o6j3N6qemNgOQeLyE9emZNFpHsgLUdEHhSRZSKyTkSeEJHsEta5pLIOFpFFIrJcRE4NfN5ARL4TkbqBdclX1VwAL8exPinn/R2eF5HfRGSTiHwvIkeWsZjI+rzG+1tt8v4u1wQzV5L6fEZE5ns7kbMj0tK2PouJyAgRmS4i+SIyuhxFRNbpIBH5UkQ2RNuRp6hORUTuFJGl3nwniEiP0mYgIgO8Bv7OwGdpV6ci0khE3vIOVH4TkTPKWMT9qpoXKC9HREaJyEYRWSEiVxanqeoCb50nllLmMu938ZFXZksRedfb7lRE8oKZS5qnl36wiMwTka3e76tdrBmLSJ6XZ6v3nUMiyklJ/VaKRtf7o+d6C94cwDYArydQ3pERZU5OpDwAEJHOMH/UiwA0APAegHdFJMvLch2APQH0BNAFwB4ARpazrIcADAZwBIAnRSTT+/weAPeq6qZE1iXFsgD8AWAAgPoAbgLw38iNp4wEwFkAGsL8TUaIyGmJLGQy69PzA4CLAXwXJS2d67PYMgB3AhiVpPK2eGVdU1rGeMVRp0MAnAvgAACNAHwD4KVSyswG8DCAKRFJ6VinjwPYAbOPHQqz3KUedJTgVgCdAbQDMAjAtZL4GWsRgI8AnFTWeYpIEwBvwuxzGgGYDmBsCfN6FcD3ABoDuBHAGyLS1EtLWf1WikY3wskAVqH0I6S4eDv7A1DKxhWHwwFMVNVJqroTwH0AWsE0LoCpoEdU9U9VXQ3gEZgNvDxl1VHVn1T1B5iNpLGI9APQXlX/m+B6pJSqblHVW1V1saoWqer7ABYB6JtAmfer6nequlNV5wN4B0D/BBc1mfUJVX1cVT8HsD1KctrWZzFVfVNV3wawNknlTVXVlwAsTEZ5ntLqtD2ASaq6UFULAYwB0D16Ub6rAHwCYF7E52lVp2K69U8CcJOqblbVSQDeBTAsgWLPAnCHqq5T1bkAngVwdiLLqaorVfUJANPKMc8TAcxW1ddVdTtMA91bRLpGFiIixQfSt6jqNlUdB+BH2MY+ZfVbGRvd4QD+o4GHQovIehHZv5zlnQWzIS5KcLnE+xc53bOE9NYiUr8cZa0Skd4i0hvmyG8dzJHXpQmuQ+hEpDnMmeLswGflrk8REZiDqNml5S2tKCSvPktTZeozlgS30aQtBkqu09cAdBIz3pgNs6/5KGZhpmvyXAC3R0lOtzrtAqBQVRcEPvsBQA8AEJG2Xh22jacwEWkIYBevjL+UlwpxzLNHMM0byvg1xjL1ALAw4ow1WFbK6rdSNbpehQ8A8GLwc1Vt4B2ZlcdZAEYnuGgA8CmAAWIG/2sAuAFADQC1vfTxAC4TkaYi0gK2cmr/tahSy7oIpkvrGZgj0b8D+BxATRH52BuHGBCl3ErF27G9DOBFVfXPFBKsz1thfrcvJLh4yazP0lSJ+ixJgnWaLKXV6XKYHrT5MENYQwBcUUJ5j8A7M4ySlm51mgtgQ8RnGwDUBQBV/d2rw9/LUF5xGX8pL0VKm2eJ6xilrJLypqx+s0rPEqqzYLp/Ej0rBQB4R94tALxRSr7xMGdPAPA3Vf3LgLiqzhOR4QAeA9ASpmtqDoAlXpa7YMaRZgLIh+n22B2mq7xMZanqTAADvWVrCeDfAPYF8BWAy2HG174WkXbBHoHKREQyYLr0dwAYkaQyR8D8Rg5Q1fwS8oVan6WpCvVZ0ZJUp7cA2AtAGwArAJwJ4AsR6aGqWyPmNxhAXVWNOiaYhnW6GUC9iM/qASjv2GTxgUg92CGVEssTkeDBS2nd+uWZZ1nWscS8qazfSnWmC7NDfbHUXPEbDuDNGEeqvogLr2Jegaaqb6hqT1VtDLMBt4M39uCNC4xQ1Vaq2gFm7GuGN3ZUprIiPAhgpKpuA9ALwHRVXQwgG0DTKPkrnNcF/DzMBRsnqWpBEso8F+bipoNVdUlJeSuiPssg7eqzMkhGnQLoDXMV9RLv+oDRMBfnRWsADgawp3eF7AoApwK4XETeiZI3Hep0AYAs72KzYr1RzmEaVV0H03PQO97yAvWXW4Yz6rLMc3YwzRvH7hhjmWYD6BC8CrmE5U9q/VaaRldE9oO56CGhq4wD5dWC6T4anYzyvDL7ikimd4Xb0wDeK+42FZFWIrKLGPvAXEF3S3nKCuQ5FEBNNRcjAeaCpIO8Kw5zkKSLWlLgSQDdAAz2fqgJEZGhMLePHKqqSbvwJsn1WUNEasKMIWaLSE3vbD+YJ13rEyKS5a1fJoBMb/3K3VMmIhleedlmUmp6XcKJLmdJ29U0AENEpLk3/2He/H+JUtRNMOOgfbx/78L0dpwTMb+0qFNvfPNNALeLSB0R6Q/gOCR2gel/AIwUkYZiLla6AEnY33q/ixxvMsebjmeebwHoKSIned+5GcCsyP0qYG5pgunFusX77Z0AYDcA4yKWJfn1q6qV4h/MBvJSjLTNMF2K0dJuBTAmyuenA/gNgJTle4F0BdAp4rNJMN0Pf3rLWyeQdiCAxQC2wowZDY347ngAN8RTlpee4/0o2gU+O9ibx3IAp0XkHw3gzkpQj+28v912r96K/w0N5ClTfXo/9IKI8p6qZPU5wZtH8N/AdK/PiL9v5PrdmkCdDoxS3oQU12lNmNtmlgPYCHN71xGB9Kcif1cl1Ue61SnMbTRvw9yu9TuAMwJpbb06bFvG9R/l/S1XArgyyvcmADg/RpkDASyJUa/Ov3jnCeAQmCvNt3nzzotVvwDyvDzbYLbxQ8Ko3wrfmJPwQxrp/YjWI6LhKuE7870f2KgS8myHGVi/o6LXsZR1yfHWfQvM5e8VvkysT9Yn67Rq1SnMWf5mAL/Gmb+zt85bAZwdI8+BXoO3HsDhFb2OYdWveF8iIiKiFKs0Y7pERERVHRtdIiKikLDRJSIiCkmoD8c4NGMIB5AryKdFr0vpucqG9VlxUlGfAOu0InEbrVpi1SfPdImIiELCRpeIiCgkbHSJiIhCwkaXiIgoJGx0iYiIQsJGl4iIKCRsdImIiELCRpeIiCgkoT4cgygVFt+5rx8X1nSfBdC0x2o//qa386pMR8cv7GtS606t5aQ1f2RyootIRASAZ7pEREShYaNLREQUEja6REREIeGYLqWldR909uOf+jwW13cKSnj0+7xBz/nxy3u2dNL+++kAPy6c+3OcS0iVifTt4Ux/8O5LftzrqRF+3OYOjt+HLbNBfT+e/1gHPw5ukwAwclVfP/5xaBcnrXDOghQtXfLxTJeIiCgkbHSJiIhCwu5lSgvB7mQA+F+f1+L63lPrbXfVA98c6sd57VY7+T7p/qYfD6273Em76+wmftzh/9i9nI5W7VXPmd6JQj+uvYyvnK1IRe1b+/GPA5/248jhoDubzfDj3ifs56S1YfcyERERRWKjS0REFBJ2L1OltfNge7XiF70fj0jN9qOH1tkrGb88dU8327JVfthl3XQ/zqhZ08l295RefnxDkx/d5Wi4M+5lpspp3W6FzvSSnfl+3Pj5b8JenGotq01rZ7r9M79U0JJUDJ7pEhERhYSNLhERUUjY6BIREYUkrcd0116wrzPddpgdG5i3qrmTtiPfjgG2etXGtZdsdvIVzZyTzEWkBGxuVcOPMyKOD4PjuBOOteOxhQvnx1X2L7ft7ky/0ujfgakcJ631Rzw2TUfav48fTzzmASdtwNeX+HEnfB/aMlVXv99sb/Hpe4S7j72/5cQyl5e7n3vL3x832fKbzLLXYNR6Z2qZy0417k2IiIhCwkaXiIgoJGndvXztNa840yfVWWcnOpbwxYE2XLxzq5P08OpBiS9YnKauaufHdf5d30nL+nxGZPZqp8F/7K0cJ08/00mTdRv9eOfyxWUu+/yjPnOmczNyYuSkdPVn91p+3DKztpPW6o3syOyUQrP+9qgfF2hhCTnjM6H3y+4HvW341hb7wpJRm453smV9UfH7VZ7pEhERhYSNLhERUUjY6BIREYUkrcd0H7nhNGf65t3sMUTDue4rKtZ1Ez+usdt6P76/55tOvgdbTvHjD7bm+vHRtd1bi0qyTXf48ZT8On48sGaBmzEwr06n/s1J6vJ53LOrFpLxkurFd9lbzM5r8K+IVPtYyKuW7+Ok1P1srl2OhJeCwnLwxfaagLe3NHDScifYW8tYp6mRPcGOrWZLZsLlfb+jyI8XFzR10k6o86cfn5JrH/16ykvPOPmOadUXFY1nukRERCFho0tERBSStO5ervPGlIjp2Hnrxfj80RYDnek7++fZ73xln3B1/8BOcS9X1jbbDVJnln0heuOvxzn5etUIPBlrMW9hSIX1w2yX8v/Osl3K9TPctwx9k2+7v2be6T6tqtbGyvdUG/qrzB67OtN3N3vVj5/f6L7ZpnD9hlCWqTrZdnw/Z/qclq/7cfA2oXhvGer5+UXOdNPP7W19ORvcMq4faM8ffxzySMwyl1xvn1zV+p7JcS1HsvFMl4iIKCRsdImIiEKS1t3LybBzxUpnus44Ox3swKjzxtpylb/yfNu92aOG++f+15+2OyzvhYXucpVrbhRpzR72KvbILuWg4RPO9+Mub7M7OR0tPbRxzLQZm9pFfLIttQtTTQS79O98wL1SeM8aO4I5Y5YRfILUyC9P8uNu185z8hVu3IhYdv3ZvgBl6rF2O++Xs93JN/7v9/vxYTWvddLy7rZPq9L8/JjzShTPdImIiELCRpeIiCgkbHSJiIhCUu3HdFMhq10bP37shsf8OPKpLK8/fIgfN17+DShxOz51x+6+6Rp8Ob0d6+n9zXAnX7erfvVjPqEoPW3sXhAzbeZjfZzpBuD2lgxFgetU3DHc2M797QhnetOp9m1QXZbY6ynKsh0Gn1h38Wh7q9H0vz3k5GuZaef13Xlu2klv2n2C/jAXqcIzXSIiopCw0SUiIgoJu5dTYN4Vrfx4rxz7ooXZO9zbFBrN2RraMlVlWR3y/PiOTq87aQ0DtwnNCNwF0O4Ot/OqcN26lCwbpVb+kXv58TuHPeqk3b7GPty+0bhZTloRKEw3rNzTjzee797aVbjk56TOK2/cGj++6Xj35SX3tpiW1HmVB890iYiIQsJGl4iIKCTsXk6C/KP3cqa/O/nBwJR9SPffL7vMyVdrMp98lAwd/7vUj3evEfs48vTAA9S7/FDx3UyUuCUH2V3YbjXcJ44NX9zLj5ttcZ9uRMlX0jtzZ+0RfL95cruT/0LskF5WhjuQUNIyLrvNxi2OT/pS+XimS0REFBI2ukRERCFho0tERBQSjukmwe9HuscuuWLHcU9fdKgf1/7oByefgspr3XD79qbbmgefOpXj5Bu+2D71q9u1v/gxnzpVNTTtucqPC9Udv8t6p2HYi1PtzP97bT+O9+X0qbb4RHtL0htN3etmCjQzELvLu8stNk7lLWU80yUiIgoJG10iIqKQsHu5nDLq1vXjYQdMctI2FtkXJ6+6u4Mf5+TzNpXyymq1izN9wKVT/Dg3Iycyu++bOZ38uMs6/v2rgqz29qUW/9rVPoHs2Q1tnHyNRvGlBqk28oD3KmS+WW1aO9Ob+tr9w1PnPBFXGVPz3VvMZMfOxBcsDjzTJSIiCgkbXSIiopCw0SUiIgoJx3TL6edbe/jx+03cMYTjfj7Jj3M+5DhiMsy9wR2ve7tF9LGkQT8OcaZ5m1DV8/Pf7PjdPoHh/Au+G+Tka4OfwlokCtmc21o407MPeyyu743b3MSPn7za3VfUnBvOY3l5pktERBQSNrpEREQhYfdynDac6b4Medapj/jxrzsLnLTN99nL2XOwPLULVk3MOPbBiE+i3yZU/2L3WTI7+XL6Kqeozfaon29bXzPq51Q1ZE9o6cf3tBxXrjJGL93Pj2u+VzFveeOZLhERUUjY6BIREYWE3cslCD4F6fKbxjppOWL/dKf9MMxJazqeVyxXlILm9Z3p7B2tylxG4eo1zrTm5/ux5Nhu7cymTRBLYdMGzvTPV9WIa95aaF/A3fWSX5y0wo0b4yqjqnti7zFRP281PvYLyik1MsUO55T0gviNZ+wTM+2225/340G1og8dRJb/15crxFf3etDSuPKlEs90iYiIQsJGl4iIKCRsdImIiELCMd0IkmX/JL3fX+LHQ3LXOvle3tTMj5vf5B67pPIFyFSyD94YlXAZ+31/ujO9ZmU9P27YdJMfT+n7SsLzKkn3kSOc6Q7XVs+35mwf3M+Z3r9m8FYP7sIq0r1jT/bjU857KGa+r//5uB+X9LL7Ao1vviWVEdTz84uc6c74Lr4ZpBDPdImIiELCRpeIiCgk7JuJ1HtXP7yj2Usxsz1+t31YdoMfqme3X5iOmzPUmf685xspm9fk3V8t1/e26g4/LtDYgwxHzTrbjzfMjH3bUatJ4bxUu7L7/Vi3zzF4u97ta3r5ce47M5x8cfZUUgI6jLW31009030iWL+c2Lf/JCryBfTPrBjgx+suti9D6Loo4ra7lC1R/HimS0REFBI2ukRERCFho0tERBSSaj+mm9m9izN94WvvRM3XfdQ/nOm8l75N2TLRX9U6fJEz3eNuezuNxvkrrtv1Tz8uy+0+PSaeY+f1e52Y+Tq8sdlOTP0xZr6G+DlqTFZmPXub1v/1/zBmvlfGH+jHHXby2oqwFc5Z4Mc3X3m+k/bHYHtdw4Ijn07qfC8e5d4K1OauyYGpyv1mMZ7pEhERhYSNLhERUUiqfffyvIsbOtODa0d/k0vrCTvcD5Q3JFSk9jck1pV4DPrGPy/MSmheVHZFgTc7zdm6i5N2yNI9/bjz3bP9uDLcDlKd1XrHfSl8l8BI3YGn2+G57LNXOvk+6mHf4HbYT6f5cdHoZk4+tS/gQt7M1U5aOtU9z3SJiIhCwkaXiIgoJNWyezn4APXPB/87IrV2uAtDRH+hge7l+Xu6aTXwmx+nU7didVbv1cDdHhEPfDsBdn9cBwsDKQsRSzrXO890iYiIQsJGl4iIKCRsdImIiEJSLcd0l/XP9OO2WbHHcIMvqs/e6N4yxBuGiIiorHimS0REFBI2ukRERCGplt3LJblnbXc//ubwPD/W5bEfYE9ERBQPnukSERGFhI0uERFRSNjoEhERhaRajul2uM6+oeao6/YoIeeK1C8MERFVGzzTJSIiCgkbXSIiopCI8mXsREREoeCZLhERUUjY6BIREYWEjS4REVFI2OgSERGFJO0bXREZLSI7RGRxnPm7iMhmESkUkfNj5BkoIkVeviOSusBJJiLnecupItKpopcnUSJyq4gUeOtUJ87v/Or9BsaUkEdFZIuI3JW8pU2+eH6f6YbbKLdRbqNWpWp0RaSziGwvqWJiuF9V86KU10hEVovIpOLPVHWBquYCmFhKmctUNVdVP/LKEhG5UUR+F5GNIvKaiNQLzKt4x7I58C8zWsEiMlxEZnjlLBGR+0UkK5D+kIisE5FvRKRV4POhIvJwsCxVfd5bn0pDREaIyHQRyReR0eUoYqz3t9/ilTdIRL4UkQ3Rdtyq2hHA3XGU21tVbwws52AR+cmrq8ki0j2QliMiD4rIMq8unhCR7FgFB3YYxXX/XCDtDBFZLiKLRGRg4POO3nz930kZfp8VIs230VYi8o6I/OltdxeVsJ7BRr343/BAerpvo91E5Atvm/pFRE4oYxGR22gDEXlRRFZ5/24NZi7PNioiB0T8/YsPXE4KrEcHEXlfRDaJyBoRub+0GXj7Xw02mGFuo5Wq0QXwOIBpSSzvPgBzk1TWWQCGAegPYBcAtQA8GpHnfu+HWPyvMEZZtQFcDqAJgL0BHAzgagAQkX4A+gJoAWASgOu9z+t7eW5O0vqk0jIAdwIYlaTytnhlXZOk8iAinQG8DOAiAA0AvAfg3cDBz3UA9gTQE0AXAHsAGFlKsb0DdX++N58sAPd6378EwGOB/I8AuLKE30lllM7b6BgAiwA0B3A0gLtFZFAJ5S2L2J5fBNJ/G/V+k+8AeB9AIwAXAhgjIl0SKPZBmP1aHoB+AIaJyDmJLKeqTgz+/QEcA2AzgOKDrBoAPgXwBUxdtIap45hEpCFMfc0OfBbqNlppGl0ROQ3AegCfJ6m8fWF2mC8kozwAgwE8r6p/qOpmmJ3FqSJSu6wFqeqT3g9qh6ouhdn59/eS2wOYpKr5MH+LDt7ndwH4p6puSHhNUkxV31TVtwGsTVJ5U1X1JQALk1Ge53AAE1V1kqruhKnPVgAGeOmDATyiqn+q6mqYje/ccsynMYClqrocwGfw6lNETvY+/zbB9QhNOm+jIpILYCCAu1S1QFV/APAGylen6b6NdoU5KHlQVQtV9QsA/4M5YCmvwTAnHVtVdTGA51G+v21JhgN4o/jsGsDZMAdGD6jqFlXdrqqzSinjHphteU3gs1C30UrR6HpdQLcDuCpKWlsRWS8ibctQXibMEfkIAMl6+od4/4LTOQA6Bz672Ou6mhHsAonDgbBHXrMBHCAitWDOgGeLyJ4AdlXVV8q/+JWHV5/7V/Ri4K/1KTCNQKz01t7ZTCxfi8gKEXlTRPK8z1YDaCwirQEcClOfuTBnzdcnvBYhqQLbqAQ+C6b3RGzNRGSl1+X4oNjxy3TfRiXGZ/7fopzbaFn+tmUr2JzcnAzgxcDH+wBYLCLjva7lCSLSq4Qy+sH0Xj0VkRTqNlopGl0Ad8A7Qo1MUNXfVbWBqv5ehvIuBTBFVWckbQmB8QDOF5E8b8f7f97nxWe6j8Bs3M0A3ARgtIj0/2sxLq8LZk8A/wIAVf0JwDgA3wJoC3O0/jCAS0XkUhH5WkReFpEGyVu1cHn1Oan0nCn1KYAB3thdDQA3AKgBW5/jAVwmIk1FpAXMbwqB9EgDYLrWusJ0r78vIlmqWgTg7zBnVVcDuACm8XoUQC8xY9Ufi0jSdlApktbbqKpugjmbu0lEaorIHgBOQuz6nAegD4CWAA6C6U5+AKgS2+g8AKsAXCMi2SJyGMzv1/9blGMb/QjAdSJSV8zFYuci9t+2PE6COTv9KvBZawCnwex7dwHwAYB3vO3Z4R3kPQHgEm+b9IW9jVZ4oysifQAcAjMmkIzydoHZoG8sLW/gO8GB+lhH66MAvApgAsyR7pfe50sAQFW/U9W1qrpTVT+E6TI+sZT5Hg8zlnCkqvrdHar6oKr2VtVTAZwKM2CfATP2cjDMGNh18a5fdeMd+RbX59BoeVR1Hkx31WMAlsOMr8+BV58wXYXfA5gJYDKAtwEUwOysopX3tTdcsB7AZTBdkN28tM9VdR9VHQCgCOYgazSAl2C6yO4A8Fy0ciuDqrKNAhgKUy9/AHgSZhtdgihUdYWqzlHVIlVdBOBamDOt4vS03UZVtQDA8TDj2itgei/+ixh/izhdCmAbgJ9hxotfLam8eLbRCMMB/Efd5xZvg+nmH6+qO2BOXBrD2+4iXAxglqp+EyUt1G20MrzabyDMGcLvIgIAuQAyRaS7qpb03r1Y+sEcnc7xyqsFoJaIrADQKtqAeOSVhSLSIUqeIgC3eP/gHR0u9f5Fo4jejVM8jyMAPAvgaFX9MUae5gD+BtONMhjmR1MgItNgduwUhaoeGWe+N2CObuGdlZwL7yIhVd0G0/U5wku/EMCMMlxQ8Zf6F/ODfAxmB9UEQKaq/ub9NneLs9yKMBBVYBtV1d9gLsYpLuMVAFPjXOao23O6bqPe2Gfx9QsQkclwu27LWt6fMAc1xeXdjRL+tvFuo15ZbWB+g3+LSJoFey1MaQ6G6dk6yptuBGB3EemjqiMC80r5NloZGt1nALwWmL4aZgP/eznLG+99v9ipAM4AcFwiV6CJSCMADWEu5ukG09V0e3FXhTfo/hGArTBnBWfCbITRyjoI5ij7BFUtaaN/AMAtqrpVRBYB2EvsBSHJvKgoqcRcDZgFIBNm51wTwE7vgqXylJcB0/WbbSalJoAi7+g2keXsC3Mm2whmQ3vPOwOGmNtAFOYseG+YIYPzYpTTw1u2H2EakDthdvSRV+WeD+B7VZ3p/Y1qiblNqS0qcX2i6myj3WDOvvIBnALgMEQ/K4KY20YWwpwVt4bpkXonStZ03UZ3A7AA5uz8YpiDoNEJlNcR5iK79TB/1wsRaNQTNAzAZFX9NeLzMQCuEpFDYHo1LoXpgo52NfzZAGoGpt+EOeB+PiJfyrfRCu9e9q52W1H8D+aS8O3eFaPFF2mU1KUUWV5+RHkbABR4cSKaAPgQ5vaV8QBGqeozgfTLYHa06wH8E8AFqjohxjrcBKA+gA8DXSzjgzMTcytDA1V9y1uvqTBjFn8AGASzE6isRsJ0/VwHc/CxDYHbbbz1PaAM5R3olfEhzI9/G4BPkrCcD8PU13zv/wsCaR1hupW3wJwBXKeq/jy97rEbvMnmAMYC2AizYeYBOMbrxivO3wTmN3ITAHgHICNgbnd4CuZWhUqpCm2jh8PUzzqYW8WOKF4Hbz2Cv8s9AHzjlTUZwE+w4/rF+dN5Gx0Gc0C5CuYs8FA1V2MDKNc22hfmoHMTzBXCQ1V1dslfidtZiHIWrqrzYfYvT8HU6XEAji0+GA9uo6q6PuI3twPARg1caR7aNqqqaf0Ppot2M4Bf48zfGWYHuxXA2THyFO/k1wM4vKLXsZT1Ocf/NOADAAAgAElEQVRbzu0AOlT08iRhfUbC7OjWA6gT53fme7+BUSXk2Q6zc7+jotexlHUp9feZbv+4jXIb5TZq//F9ukRERCGp8O5lIiKi6oKNLhERUUhCvXr50Iwh7MuuIJ8WvR7z9qXyYn1WnFTUJ8A6rUjcRquWWPXJM10iIqKQsNElIiIKCRtdIiKikLDRJSIiCgkbXSIiopCw0SUiIgoJG10iIqKQsNElIiIKCRtdIiKikLDRJSIiCgkbXSIiopCw0SUiIgoJG10iIqKQsNElIiIKCRtdIiKikLDRJSIiCkmoL7GvLAoH7eHHI575r5P2ZOdOKZvvplP3caYbzFxjl2n+LymbL5XN+rP2daan3PukH3d//GI/bnvfVCef7tyZ2gWr4rLatfHjZmPX+/FXM7o7+bo+YdMKZ89P/YJ5Mps2dabXHmn3FQ3HfufHmp8f2jJR+uGZLhERUUjY6BIREYWkWnYv/3Z4jh83ytwc2nxXHL3DmS4YZo95Gh0T2mJQFFmtdvHjO25+Lma+Of94wo+PfOQAJ003bUr+glVhWS2aO9O3Txjnx7tmF/nxQWtbOPkKZ/+c2gULCHYpD530nZO2T823/PgfP/7NJnw/O+XLlc4ymzR2puc/2NaPB3a2dbt0QIGTr6p02/NMl4iIKCRsdImIiELCRpeIiCgk1WZMV7Jr+PFBB82skGWo+31NZ/qU877y4y8btHbSCtdvCGWZyFh1eDs/Pqx2Qcx8e0w/1Y+bbl6Q0mWqirJat/Lj+mO3Omm71cj0410/u8iPOw93x1LDNPfOPD8+JfcjJ22Ph671412+nxzWIqWlVSP28+NbLvuPk3Z07U+ifuf4JoOd6Z1LlyV/wSoAz3SJiIhCwkaXiIgoJNWme3nTCfYpVI+0etSPu709wsnXGVNStgz5DdWZvrThPD+eULebm5ndyymVUbu2M334pZPi+l7Oaw3thGrsjBTVuv72qVNv5z0eM1+3kav8OMznfOm+vZ3pX4552o8H/DjESWszym6/haldrLSU2aWjHz931UN+3KeG2+wUIbrlT9Z1plv+zd46tnP5isQXsILwTJeIiCgkbHSJiIhCwkaXiIgoJFV2TFf793GmH7/vYT8es9HeHtJ1pHvbRyrHZvY97KcUlk5lkb+fO4Z+Z7PnY+bdWmQf31nvlW9TtkxVUfDNQQCw+rjtMfPu+a9L/LjFH+HdghMcxx358osx823+wH0cZZ21C1O2TFXB3Ovs9Q/B28HiNaXvK870gm/sdnjiS1c6aR3u+t6Pi7bH/o1VBjzTJSIiCgkbXSIiopBU2e7ldde7T7tpnWVvPLjykqP9OHvdjJQuR1ZL2yX1Qlv3iTYFymOeirLoxPi7u07++fjAVNV4Kk5Y/ng415n+ud9oPx65yh0CavWCfTtPmLfgLB1Yx4/757g3sPScPNyP2z7Kp06VJLN7F2f6s4MfCkzV8qP71rpDO9PX27cMje3o7iODugSeKvjs0CedtPtGHefHRYt+i2t5Kwr3+kRERCFho0tERBSSKtW9vPaCff349V7/dNL+s2E3P87+LLVdykFzbrdXbxao22k2fPEhfly4anVoy0TA0Xv9EDNtQ9E2Z7rgVvuy9Qx2L5eJqjjTwW1gyto8Jy1z2yqkSkZd9+lG8+/q7sdvH/uAHxch28nXdsiPKVumqmZNP/fl9HlZ9qlvF/5xoB8v2Wezky+jjh0K7HuRvYL96gv+6+QbWtf+Pg503x2D98b97sdzjq7cT67imS4REVFI2OgSERGFhI0uERFRSKrUmG7G8Wv8eJesHCft+VeO8OPWSO2l/5k9dvXjMQfbt5Tkq/ty9N8fsJfY18lP3duNyMg/ai8/fqzVszHzLYl4rU3GV99Hz0gJ+bDr2870eRMG+fHvm1r68Y7n3SdBxWvFAfYtUEftPdNJe3eXJwJTdhy3/8zTnHwN8XO55l0dFbq7XBTB/v1nPd3LjxvhGzffli1+3PLfdt/838F7OflOr/u+nVD31q6V+XbMXrfnx7/QFYBnukRERCFho0tERBSStO5ezmza1Jke2eWDmHlb3x3e02TmXdzAj/fMsbdIPL6uu5Ovzjh2KYdp5V7ZpWcCMPj9y53pzmA9lVezR2s5018+Y+/1GFTLfTD9822/9OMM2FuNih5QlIdTBmKX8eome0tY4xvie8E6/VXdk5bHTNtwuO1CbvRCfOXd3O7diE9inyNO/L6rH3dZNzW+GVQQnukSERGFhI0uERFRSNK6e1lqu48lObz2Bj/uN+0sJ60F5oayTADQJO/PqJ+/vGhPNx8WRM1HqVFj93Ux0+busE/F6frIGictzIfvVzVZX7hPf3t4/4P8+I798py0JYfZLuBfBj/lx1Pz3adanfnJRXHNu/N/7FWsH7w+Kma+++cc7setfpgdMx+VbNO4lu4HPWx4dnc7RPP1Xv2cbKt3ty/F0GPsvrNntttNPLfA3v3RI/DyAwB468hH/fj/9rnAJnw7q/QFDxnPdImIiELCRpeIiCgkbHSJiIhCktZjukV/rnem71i9hx+f0XG6k/Z1y45+nOw3T2S1a+NM/6/Pa4Epe1yz7dsmEd/kmG6qbT/Gjh9N3yv44mv3JfbzC5r5ceGCX1O9WNXWzhUr/bj2myudtC5v2vioi/ZALF0Q3y0hGbvZ20iCtw8BwJ1revpxu8vstSARDyOjMmjx7iJnesH1O/z4msZz/Pj/3navr4l1O9epvx7tTG+71N4iesKrE5y0c+r94ce/Xmr3uR2/LWWhKwDPdImIiELCRpeIiCgk6d29vGmTM/3JUtudNLHPK07a8vfr27Sn90VZre/udoHk5tkuqX12WewuV4zn2Ej5HqxDCdjWxHYjZ0tmzHzXzjjRj9uj8t1mQGX3+y22viO7MD+5y75UPfePStgHmYYih+0uvMY+2e2Ffz3gx12y67hfDLy8oNMn9nafriPmOdmKttgu6nu/GOyknXe8HTq6b087TvFcb7eLuuiH8G4djYVnukRERCFho0tERBQSNrpEREQhSesx3UgNb7OPhRxw6+lO2ls9R/vxfbe4L1GOx/R8dzywMHC8smeNHRG5BdG0ffRHZ5pvMEm9/OPXR/08+NhHAGj9XHxvIKLKa82F7rUas/Z53I8X79zmpNVaHbnNUrLlvm4f/XgOrvTjP09xt73tG3L8uNs19na9wsDL7SPtet0cZ/rgzvaajE97jPPjW25xzytbnYgKxzNdIiKikLDRJSIiCkmV6l7GVNt9W/8oN2nYwEv9eH3nHJRV42djd0kvfbOHMz1j79FR80Xe4kTJl9mlozM9fa8xwVQ/Gr+5p5Mv+zP3bTiUfrYeujlm2skzz3emm335XaoXhwKCXc25r8fOF+8bvSL3pRvfCmzPgd3xfbuNc/I90XKgHyf7yYTx4pkuERFRSNjoEhERhaRqdS+XIHOC7U5qPCG5ZW9bXNf9YO/o+bR/H2da/jczuQtCWDmomTMd6ylUj315qDPdGVOi5qP08XTfl5zp5YX2KtnGD9UOe3EoRE2fti/B2PvIM/x4Sl/3yYSXXZ3nxx2vYvcyERFRlcZGl4iIKCRsdImIiEJSbcZ0UyriAVQZMY5lOIabetsbRX8aGADMyLdPIep23xInjS8vT09Lrt/Pj/vnuLcBfZtvx3EzeYtQ1VZkbzZq/G9b72tecp9ENvc0+5Sywa+c5aTpjNkpWjgXz3SJiIhCwkaXiIgoJOxeToaIl9PHeok9pV6zg5bGTHt34+5+XLh6TRiLQyk29PTP/TjyRfXnTT/bj9vBfdlIZuNGdqJZYz8snPtzcheQQpfx1fd+PPDFa5y0Oefa7uVNd7ldz/WG2Fs/U/n0QJ7pEhERhYSNLhERUUjY6BIREYWEY7pJUFQz9hju6sL8EJekepIc+9ao43b5IWa+tTty/VjzWS9VXVGhPadYNWI/J+3o8yf68dsLW/pxZXjJOSVPp2f+cKZfGtLCj7/u9YaTdkTvc/04Y1Lqbu/kmS4REVFI2OgSERGFhN3LSTDmiKec6bk7bHfz6aOv9eO2mBzaMlUrhfZpNM/M3d9Juny/xX484Y9OftwK4Tx9hirO3ANf8OOiA93biXp8bbsSO926xY/jfYk6pYedf7hPnvvvCQP8eNhnY520Ndds9+Nmk1K3TDzTJSIiCgkbXSIiopCwezkJbl90rDO95YlWftx2HLuUU0132tcV5F23xUnrds8wP5aZdUFVy8c32u7COde3dNK+mdLVj7s+vMxJ67hivh8Xbt8Oqh6CTxw7deFhTtp7uz/nx+ftc7FN+HZWUpeBZ7pEREQhYaNLREQUEja6REREIeGYbjIc7F6WXgdLYmSkVCv8ZZEz3XZIBS0IhaLme1P9ePV7blonfOvHO0Hk2nqCexvZlMm7+PG6Xev4ccNvkVQ80yUiIgoJG10iIqKQsHuZiIiqncI1a53pZ7p08OOG+CZl8+WZLhERUUjY6BIREYWEjS4REVFI2OgSERGFhI0uERFRSNjoEhERhURUtfRcRERElDCe6RIREYWEjS4REVFI2OgSERGFJO0bXREZLSI7RGRxnPlzRGSziBSIyJ0x8uSJiHr5LkzqAieZiHTxlrNQRM6v6OVJlIjc6tXNZhGpU/o3ABH51fsNjCkhj4rIFhG5K3lLmxrxrE9lVo5tstTfsIgMFJEiL98RSV3gEMWz/6nsuI0mto1WikZXRCaIyHavEjeLyPwyFnG/quZFlHmIiHznVeIfInIKAKhqvqrmAng5jnIbqOozgTJPEZG5IrJJROaIyPGBtBwReVBElonIOhF5QkSyS1jn4h9Y8To/F0g7Q0SWi8giERkY+LyjiEwWkcziz1R1gbc+E+NYn1CISDcR+UJENojILyJyQhmLGKuquaq6xSuvgYi8KCKrvH+3BjOrakcAd8dRbm9VvTGwnAd5v5GNIrIw8gBLRJqKyCsist6r06i/GRFpG6jH4n8qIld56b1FZLaIrBGRKwLfyxaRKSLSppzrkzIi0khE3vJ+o7+JyBllLMLZJr3tY5T3t14hIlcWp5XhN7zM+1185JXZUkTe9bY5FZG8YOaS5umlHywi80Rkq4h8KSLtYs1YzIH4l17eeSJySEQ5i7xt9tTA5w2831fdwLqWZf+TUiJymrc/2+I1IgeU4evONuqVt4eIfO39/leKyGXFaQlso4NF5CevzMki0j2QJiJyp4gs9fY1E0SkRynrfJlXV1u8de/ifR7aNlopGl3PCK8Sc1V110QK8irmFQA3AqgPoA+AGQmW2QrAGABXAqgH4BoAr4hIMy/LdQD2BNATQBcAewAYWUqxvQPrfL43nywA93rfvwTAY4H8jwC4UlULE1mXVPKW/x0A7wNoBOBCAGOKf9zl9CCA2gDyAPQDMExEzklwObMBvAXgaZjfyKkAHhCR3oFsbwJYAaAdgGYA/hWtLFX9PVCPuQB6ASgCMM7Lcg+AqwH0BjBSRFp4n18JYJyq/pHIuqTI4wB2AGgOYCiAJ0vboZXiVgCdYf6WgwBcK4mfsRYB+AjASWWdp4g0ganfm2B+p9MBjC1hXq8C+B5AY5j9yhsi0tRLewjAYABHwPydig+K7wFwr6puKs/KpZKIHArgPgDnAKgL4EAACxMorwlMXTwN8zfqBOCTBJexM8zByUUAGgB4D8C73j4GAIYAOBfAATB1+A2Al0oo73wA5wE4GkAugGMArPGSQ9tGK1Ojm0wjATytquNVdaeqrlXVXxMsszWA9V6ZqqofANgCoKOXPhjAI6r6p6quhmkgzy3HfBoDWKqqywF8BqADAIjIyd7nSX6lctJ1BbALgAdVtVBVvwDwPwDDEihzMMyZ01ZVXQzgeZTvbxvUCObg6SWvPqcBmAugOwCIyGEA2gC4RlU3qGqBqn4fZ9lnAfjaW1YAaA/gC1VdCuBnAG1FpC1MY/FgguuRdGK6DE8CcJOqblbVSQDeRWJ1eBaAO1R1narOBfAsgLMTWU5VXamqTwCYVo55nghgtqq+rqrbYRro3iLSNbIQ74BxDwC3qOo2VR0H4EfYxr6Oqv6kqj/AHKg0FpF+ANqr6n8TWccUug3A7ar6raoWqepS7/dZXlcC+FhVX/bO5jd5f/NEHA5goqpOUtWdMAcJrQAM8NLbA5ikqgu9E5Ex8LbfSCKSAeAWAFeo6hxvm/9VVf8MlBXKNlqZGt17vFP7/4nbpdrW695rW4ay9vG++6PX5TNGRBoluHzTAcwVkWNFJFNM13I+gFnFi+r9Q2C6tYjUL6HMr71urzcDXWOrYTba1gAOBTBbRHJhDiSuT3AdwiAxPuvpT5j63D+Bcp3yykNVV8KcvZzj1ee+MGdEk7ws+wCYD+BFEVkrItNEZECM4iKdBeDFwPRPAA7z6jQPwK8wB2XXqmpBIuuRIl0AFKrqgsBnPwDoAZR9mxSRhjAHYj9EKy8V4phnj2Ca1036a4xl6gFgYcQZa7CsVV73ZG+Ys+91MGe/lyZhVZLOOxPfE0BTMcM/S0TkMRGpFchT1m10HwB/el3Aq0TkvTLus6MuKv663Qe3/dcAdBJzTUA2gOEwZ9vRtPb+9RQz3LhIRG7zGmMgxG20sjS6/wdzRtcKwDMA3hORjoDfdddAVX8vQ3mtYY7KT4LpXqoF4NFEFtA7kvoPTLd1vvf/3wJjGuMBXCZmHLAF7AZXO0aRA2AqtyuAZQDeF5EsVS0C8HcAb8B0d1wA4HZv+XuJGVf6WEQSanRSaB6AVQCu8cZDDoNZV//v4NXnpFgFRPERgOtEpK6IdII5y431dy2LVwHcDFOfEwHcGOhGag3gMABfAmgB4N8A3vG60WISMy7WHKb+il0NU6fvArgCQH8AmwAsFJF3ROQrERmShPVJllwAGyI+2wDTDVmebTI3UMZfykuR0uZZ4jpGKaukvBcBeBhm3zUMpq4/B1DT21a/LMMBWxiaA8gGcDJM12wfALsjMBxWjm20NUyjdxmAtgAWwWxfifgUwAAxF9HVAHADgBqw2/5ymO12PoBtMN3NV0QryFs+wGzTvWCGG06H6W4GQtxGK0Wjq6pTvO6IfFV9EaY78qgEitwG4AXvAo3NMAPeMcvzBtCLL4CJejGBmAsn7gcwEKbiBwB4TkT6eFnughnzmQlgMoC3ARTANEB/oapfq+oOVV0P80NtD6Cbl/a5qu6jqgNgjpz3BDAaZrzibAB3AHguWrkVzTsqPB5m3GQFgKsA/BfAkgSKvRSmTn+GGS9+taTyRGR8oD6HxsjTFWYM7yyY+uwBM+Z3tJdlG4DFqvq817X8GoA/YDbGkgyHGQPaXPyBqv6mqkep6h7e8t8Os5H/y1uGY2HGkxPtjUmWzTBd70H1YHZC5S2vuIy4yhP3orTynDGVNs+yrGOJeVV1pqoOVNW9AcyBOSi8G2YbvQ1m3PQlEYnWC1QRtnn/P6qqy1V1DYAHkPg+9y1VneZ1198GYL9YPX3xbKOqOg9me3oMpoFtAvP3Ld72bwGwF8wwUE1vnl+ISLQD8uJ1vl9V13tDP0/DW+cwt9FK0ehGoYjeTRmvWV4Z8c1MtUfgQphYV1D2gRmnm+6NgUwDMAXAIV4Z21R1hKq2UtUOANYCmKHxX/T0l3X2NtLHYBqdJgAyVfU3mDGs3eJdv7Cp6ixVHaCqjVX1cJhejKkJlPenqg5V1Raq2gPmdxuzPFU9MlCfsa4S7Qlgvqp+7NXnfAAfADjSSy/TbwgAvO65IXC7liPdDOA5r3u7F4DpqroBZkfSqSzzS6EFALK8C1mK9QYwuzyFqeo6mJ1m8CK1EssL1F9uGXu54p3n7GCaN47dMcYyzQbQQQJXIZew/A8CGKmq22DrdzHMmWXTKPlD5/1tlqCMv+9SRG4vxXHU/Xic2yhU9Q1V7amqjWEa2XawY/i9Ya6iXqLm2p3RABoi+rjufJjx9njWOaXbaIU3umIuqz9cRGqKSJZ31HMggI8TKPYFmLG6Dt5Rz//BXE2biGkADig+sxWR3WG6ZmZ5061EZBcx9oG5KvKWaAWJSA8R6eONJebCdF0uhbmQJ+h8AN+r6kyYRryWmCuzByGBKw1TTUR28+qztohcDaAlzJl6ecvrKCKNvb/XkTBXRCd6j+P3ADqLuW1IvOGMY2DH+d4C0FBEhnvzPRlm+ON/JZR5AoD1MF3S0dajO0xPyZPeR4sAHCQizWGGQcrcuKSCN2TyJoDbRaSOiPQHcBxKuDI0Dv+BuSq0odfLcAES+E0UE5GaAHK8yRxvOp55vgUzvneS952bAczyzq4c3tj2TAC3eL/rE2AOescF84m5Irimqhbva4rrt4e3jGsTXd8kegHAJSLSTMz49+VIbB/5AoATvP1aNsz+b5LXk1duItLX2/6awpyZvheoo2kAhohIcxHJEJFhMAc3v0SWo6pbYc5Yr/WGqVrD/B6cdQ5lG1XVCv0Hc/Q3DaarZj2AbwEcGkhvC9O90zbG90cDuDPK57fBXJS0GmZn0TCe73lpeTBHRFkRn4+AqdBNMI3eVYG0AwEsBrAV5qhqaMR3xwO4wYsP8vJsgel+fhtA54j8TWAG9+sFPhsK02W7GMCgiPwTAJxf0fXpLcs/YS4m2eytd6eI9M0ADojx3VsBjIn47BSYce+tMDu/w+P5XkS6RlmOU7y/8SaYo9j7AGQE0g+AuUp1M8yFdAcE0p4C8FREeR/DXC0baxm+BLB3YLo3THfZGphbweJenxDqsJH3u9wCs6M5I5BW5m0SptEZBWAjgJWR61vabxhmR7gkRr06/+KdJ0wv1TyYrscJAPJi1S/MPmGCl3c+gEOirN9MAO0Cnx3sbavLAZxW2t8o5PrNBvAEzD53BcxFQzUD6WXaRr3P/w5z8rAO5vaeNmX5TSP6NjoJZvv8E6bRrRNIqwlza9tyr46/A3BECXVYD+biq00wQ0U3w3vpTyBPyrfRCqnwJP94nvV+IL/GmT/H+6FtgbkFIFqedgC2e/kuqOh1LGV9OnvLuRXA2RW9PElYn5Fe3awPbmClfGe+9xsYVUKe7TAXv8RsFCvLv3jWpzL/K8c2WepvGOagdpuX7y8HXenyL579T2X/x200sW2Ur/YjIiIKSYWP6RIREVUXbHSJiIhCwkaXiIgoJFmlZ0meQzOGcAC5gnxa9HrSb8xnfVacVNQnwDqtSNxGq5ZY9ckzXSIiopCw0SUiIgoJG10iIqKQsNElIiIKCRtdIiKikLDRJSIiCgkbXSIiopCw0SUiIgpJqA/HICKi6iejdm0/7jt5k5N2S9OZfnzYnBP9uMahv6V+wSoAz3SJiIhCwkaXiIgoJGx0iYiIQsIx3RTIatHcj3d03iWu72QvWOpMz7++gx83mGOfm91o7nYnX8bE78uziERpY/vgfs50rfHf+bHu2d2PFx1bx8l3wEE/+vHEL3rFLL/lN4V+XPO9qeVeTnIFx3EXPLOrH7/d9BknX1Eg/uOHln7cERzTJSIiogSw0SUiIgoJu5fLacOZ+/jx2qPcLt/rdv/Ij8+q92Fc5T2/oa0zfWLdt/y44ZCaMb93TKu+cZVPVNllNmnsx4Vja/nxa50fcPKtLMz24/oZE/y4bVZtxDT865hJq87c6sfLHqnhpP3t7sv8uPGz38Qun/5i4Y29/XjOoEf8eOjCI518a+9q78cdP/o29QtWwXimS0REFBI2ukRERCFh93KEjN7d/HjeJfZqyImHPeTka5o5zX4nCccu59X/PeKT2F3KRFXRgoftEMv8rs8HUtxu42aZNn5ifRc//m6TO0SzZEuDmPPKFHvN7Ae7vhe1bAAYO/KffnzR3BFOWsakmaDYdjTbGfXzWRM7O9PtP6pe3fY80yUiIgoJG10iIqKQsNElIiIKCcd0I2xpX9ePFxz5ZCCl1l8zJ+ip9fapUy//tle5yqiPX5K1OFVeRh/79KLtLdynFy0+3j716+R+05y0ArUDfV++ZJ+O1PKrDU4+/X52UpazutB9ezvTY/d7OjBld00fbXPHdO+9Zrgf1529xias/tPJl7Huj9jzzrB12uXfF/vxnFMedfJ1zM71420jNzpp9c+2T57buWJlzHlVV9m5O/x4U5GN236aXxGLU2nwTJeIiCgkbHSJiIhCUmW7l7Nat3Km5/5faz9uPtl2JdZ71X0CSka++vGCAtsl8sdO9/aDNlnr/fjsn4Y7aevm2ifrNJ9my2sw2e3u0s2b/bj+enYTJ4P27+NML/yHjV/Z91k/7lsj4t6QeF1jH4i/7eodTtIz62339RM/DHDSOp8314+LtrtPMKuuCuq7T3/qU8Pujopgt5trXjjXydfmrcl+XIhyKrLf7HSF3Qd0q+HeFjTruIf9+Ktebzhp/Q+x3dL1x7B7ObNTe2d69oGj/PiyZQfbfF9+h+qMZ7pEREQhYaNLREQUEja6REREIalSY7qZDer7cb8PFjlpbzd514/7T3fHbYJyxtvbRa45+mw/Lpw9351XN/sos0bzf3XSGhUtiFp29IeiUXkU7W/HbhfboTV80P9xJ1/HrOCtXnYc99Nt7i1gN8w53o/X/+6O3/90vL2N5KaV9u1S97eY7uTrXcu+dPuBfmOdtOuvONuPW98zGQQU1pSYabtNPtuP294V3t+r8z+mONPvH2Jfqj4kd62Ttv7YLX5cf0xqlysdzL819mM3w5R/pL39clOb2E1c0xnuLWA6I5xb/nimS0REFBI2ukRERCFJ6+7ljJrum3jy37Ddyzc0+cJJ2/VN2wfZ9S3bjVDSLQeRXcpO2tyf41xKSoaFr7i3Ar0c8/Yft9v49EWH+vG0efaWhq6XzXXyNd1i67ppxLwv6nuIH6+6tJ0fX/Gke9vRyOYT/HjitpZO2swRtov6+DHH+fHOP5agutr1+tjdeZkz6sZMC9ON0+yww5BBzztp/+jxtR+/j4ahLVNl9eDeY2Om/e+VPfy4BRolXHgAACAASURBVBIfLvj15d2d6Yf3ftWPe9WY5MfNM3NilvFLgTvgd9wbV/hxx6u/jcyeNDzTJSIiCgkbXSIiopCkXfdyZkPbjTPvji5O2vxuT/jxjIhnane9faEfF250r1qjyiGjjvsSgp9v7+XHcwe4VyVnBK5EnhZ4itjQd/7h5Nv1NtuN3GW9vdq4CPHrVXepH3+aZbuop/+zr5Ov8QP2ytfj66yHK/aVutVJxm5d/Xhgg0+dtAUF9kldTWYVhLZMJWn4VWAIa1DFLUdllVmvnh/XyXB3up9ss9tziwfj61KWbPuUsh2DdnPSbnzyBT8+sOYMJy1b7P5gar7tUj5r3hAn35XtP/HjY+tsddKeON4OHzw06gQ/LpwT/W6U8uKZLhERUUjY6BIREYWEjS4REVFI0m5Md9mZ3fx4/gnuC6ff3WLHe58/5lAnrXC1+9QoqnzWH9vLmf5iyL/8OAPui8w/32bHbe692L7lqdMn7qX+8b6FRrLsppCxa0cn7bm3G/nxP//zoh/3qrEqohS7jJniHs/2mnKGH7daVX1/iz8Pt08tOi13tZO2/6xhflzvw2mgym/R5T39eP+anztp3b88y4874fuYZQTfTjT/H839eM4pj0bLDgD4fFuuM33xx2f7cdeH1/hxzgJ3W3sc9jqgRz9v46S93/VNP76nrb39tMacmItRLjzTJSIiCgkbXSIiopCkXffypr23xUx7eJF9UXKtBdW3Cy9dacR75bdr7NtsNhXZJ0+t2NveZrDtxH5Ovk6dl0f9/obt7tPMhrSzL9b+R4OXnLTpO2z5/XOCNxu5Xd5B/9vu3pTU6k67LpqfH5m92rjiyA/8OHiLEADUeLxxYIrbbzqQ3WLffpn9a62YaUHBFyXMG2RvDYy8rW/owiP9eOO1rZy0zt/Y2/XiHVL6ZWEL94Ou0fMlG890iYiIQsJGl4iIKCRp1738av9nAlPuMcMb3e1LLfd94Conrf27O/w4c8J3oMqn4TvuA/AvPGuoH4/p6r6w9Ng69ilUJ/3dPomsUGM/aypf7QPOc6Skn76b5nYpWzsjOrIGzjrNjxv9w03TheG8qzOdPL32QGe65vtTK2hJqLy6NltZ5u9I3x7O9Fv7PxmYyvajHhMudPJ1Ps8+XU62/1Dm+Zbm5lX2Pbw1J/zox2V5el08eKZLREQUEja6REREIWGjS0REFJK0G9Ptl2P7/AvUHTdrmGFvA5l3qvtWmoJTbN6en1/kx/WnubeObG5txwrr2RcTocmsLTGXac1u7ttxmk+wTyoq5K1LcSvatMmZzjnMTl/Y/EQnbe6teX58WF87/rJgQzMn329Lm/hxZg37Gzh211lOvvtbTEdZdf/SHXPa9Sr7NqKdKyOfVlU9ZTao70zXzVhSQUtCqdC6tn2bVkbkOZwoollwqfti+W7Zdp/ed9qZftxxqPsUq2SPrWbn7nCmt+y0y1W0fXtk9qThmS4REVFI2OgSERGFJO26l9u/d4EfLzjmqbi/F3zJ8fxDnrUJhyRlsRxTr7NPH7p8TuA2kmOS+zLk6qQworu2y9/t9OLA5zXwm5Ovc8R0sU/e6u5Ml9S9vHinfdn18Y9ea8t+yL3FpXDnTpBryXnu7SFD637px99tyQt5acou/6gNMdO2FtWImVZdFKk9byuK7ACO8US5ls3XO9PB73Vvam9BWpeE5YsUfLnC7ANHOWkHzjrFj+ul8IloPNMlIiIKCRtdIiKikLDRJSIiCknajenu+g97Gfnhr7u3bJz12Ht+XDvDfZPLMbXtC7OD47up0C/HXio/afeX/bjHPy918nW85puULge5Ft29rx9/t9eDEamxx+dOvt+O4+7y+GQ/jn5DBKWznQf1daZf2/2xwJR7q8tb99m3mtXHt6lcrCqlwXnu7ThTJtpbhh5ra/fh+953tZOvyyP2+oydS5eVa97dxtoyVha6b6yr+XCjwBTHdImIiNIeG10iIqKQpF33sgZuy8j+bIaT9mrXXWJ+75GT7a07hdn2Uvb9rnZv+7i3xbREF9ERfEpL697RX6hOqbPsmv38+OOh9/txLYn9AvqH13Vyplu8MNOPk/1UHKp4wS7lPy9znzzXNdt2KV+8tL+T1mCsfVtZdRlqCN5yAwAH1v+izGVEdg3fd8jxftx7nH0M4E9nPuLku3jAID9efnQjJ61w7Z9+vH6YHUba//IpTr6bm//Pj/u+5nZfd/wonCECnukSERGFhI0uERFRSNKue7m86rwxJern7/Xe15m+d5jtXt6q9oHYfb/+u5Ov3XP2Cug1l2510qbv5b5wncJTcNiezvTbI2yXctus2F3KvweeOvXu/x3spOVsTe6QQ3VSb7H7UpLg070qkmTZXd/6K+yLNabv8ZqT79Nttfx4wU3u07VqFJT9JRnprvCXRc70ayv6+fEJHT9y0trt/7sfZ9arZ8vYuNHJt3PhYj+esbs9DzxwmHu3R6NZ9klW0qTASVv0WBs/nn2gveI88grlYJdyx6sr5opznukSERGFhI0uERFRSNjoEhERhaTajOnG0vZj98lVGGbD2mKfUjR3wPNutnaH+vGHeR9HlBr9WOb3Fe5l7p2d9+NQMiw+xn3aWF6Mcdzlhe7Y4lmXX+XHtT+IPv5PZVdnnPu3/OiObn7cseZqJ+3n1j39eOeSpQnPu2j/Pn686GI37aRu9jawu5u547hBd1893I9rfTw1Zr7qavv5dqz2gXFdnbT3u77jx5d9bm+3mvqUex1N7rLob+davZd7g95el9rbif69yyQnLXhr5jMb8vx49L+OcfJ1HFXxTwHkmS4REVFI2OgSERGFpNp3L2dP/9mZ3ue70/342z1ejfm9l/I+DUy5xy75ai9nPybwEvuul7oP0XZvpqDyymxsu+2/P/GhiNQcRDNw0ghnuuNb7FIO28UN3NtPVr5vuyqn/9k24fLvbf+MH/epEXtXN2OH3RKHTT3PSev4xTw/5vb6V4UL7D7t6+PcW6oafmCf7vXgLhNtwu0TEUuwm7ioDM9/6znpHD/udOUaP260tOK7kyPxTJeIiCgkbHSJiIhCwkaXiIgoJNV+TLdo0yZnusUlDf148Khj/fiGvA+cfPvm2BGecZubOGk3fniqH3e6wj5qjGNCyZPZ0NbT5VPsGFGuRB/DBYD71trbVTpf4I7l8+1B4QjewrHqsq+dtNua/mAngnG52d3bzoit7wf7hFecOdY+brD9de4YILfZ+AUf5wgAbw+0t4A9co59k9CW9u4jHD8+wl6HcfjHl9uEEl7dtOtz253pvGmz7HLEs7AViGe6REREIWGjS0REFJJq370caedi+2YMHGTDSy91H2mzaS/79oquI9c4aZ1+q5i3V1Qna461T785rPaXflxYQpfUh7cN9OM6W3iLUEVoFHgi0LSvuzhpD7xtuwyvbOh2/5dH16/O9eMaP7pPJmt9z2Q/bo/Kd1tJVVC4cpUft7p3Vcx8l8A+raoL4nujVwmbeaXHM10iIqKQsNElIiIKCbuX49T8kcnudCCu7FfLVUUnXf2ZHxdq7GuPO713kR93Gccu5cok8oXon/Wsa2PskXD5HTCz9ExEIeOZLhERUUjY6BIREYWEjS4REVFIOKZLaal3LXtrV6bYY8dvt7vPEOp+v71VgWPvRFTReKZLREQUEja6REREIWH3MqWly1+2Lxufd8ETfnzuqEucfG0Wurd6ERFVJJ7pEhERhYSNLhERUUjY6BIREYWEY7qUltrdYsdqD7+ljx+3Acdwiajy4pkuERFRSNjoEhERhURU0/l1wEREROmDZ7pEREQhYaNLREQUEja6REREIWGjS0REFJK0b3RF5FYRKRCRzSJSJ87v/CoiO0RkTAl5VES2iMhdyVva1IhnfSozERntLf/iOPN38eq7UETOj5FnoIgUefmOSOoCh0hEcrx1KBCROyt6ecqD22j6b6NB1X17jWd9SlIpGl0R6SYiX4jIBhH5RUROKGMRY1U1V1W3eOU1EJEXRWSV9+/WYGZV7Qjg7jjK7a2qNwaWc7CI/OT9wSeLSPdAmojInSKy1FuPCSLSo4R13k9EporIJhGZJSL7B9J6i8hsEVkjIlcEPs8WkSki0qac65MyItJIRN7ydoK/icgZZSziflXNC5SXIyKjRGSjiKwQkSuL01R1garmAphYSpnLvN/FR16ZLUXkXRFZ5u2w84KZS5qnl36wiMwTka0i8qWItIs1YxHJ8/Js9b5zSEQ5i0RkuYicGvi8gYh8JyJ1A+ua763ry6Wsa0qJyAgRmS4i+SIyuhxFRG6jg7y/z4ZoO+8UbaM5IvKgV//rROQJEcmOVbCIHOTVx0YRWSgiFwbS0m4bDfL2T9u9v9NmEZlfxiIit9fihnhz4F8mUP7t1Sv3Em9b2ej9/oL7yfER89shIj+WsM61vTpf4/3uvg6kneFtj4tEZGDg847e7yiz+LMyrE9UFd7oikgWgHcAvA+gEYALgf9v776jpCrSNoA/NYQZgiAzCCxhGHLOIiBLEBO6gqKwKyIILrLsmj5RdI2D6B51/c6iYFwFA+4aUEfAbxUD6OoCEiRJWiUpLAJLHILAMO/3R13q3mq7e3qmu2vS8zuHw3u7qqvvndvVdavqBrymlGoZR7FTAFQFkAXgHAAjlVJj4lzPFtA/fOMBnAlgLoA53voDwDAA1wPoA70diwDMjFBWOoA5AB73yvozgLlKqVpelkcA3AGgE4D7lFL1vNcnAHhHRH6IZ1uS5GkAJwDUBTACwLPRDjpiMAlACwCNAZwH4E4V/xFwPoAPAVxV2M9UStUG8C6A+6H37zIAb0b5rNcBrACQAeBeAG8rpc7y0p4AMAjAQOi/0+kK/QiAR0Uktygbl2T/AfAwgBkJKu+IV9bEBJUXSx39I4CzAbQH0BJAVwD3RSirEoAcAM8DqAngNwD+opTq5GUpjXU01E1eI1ddRFoloLw/B8qrLiKn4ilMKdUDwKMAhkLvg+kAcgKN+SXBzwOwEMCsKEX+FbrutvH+v837nIre53QFcDOApwLvmQpgQrzbElTsjS6A1gDqA5giIqdEZD6AfwEYGUeZg6C/AEdFZCv0zro+zvW8GMAXIvKliOQBeAxAAwD9vPQmAL4Ukc3eDnoNQNvwReFcALtEZJa3za8B2APgykBZ80VkB4BvAWQqpTKhG4spcW5Hwik9ZHgVgPtF5LCIfAl9UBHPPhwF4CER2S8i6wG8AGB0POspIrtE5BkAS4vwmVcCWOvts5+gG+hOSqnWoYV4B4xdAWSLyDEReQfAGviNfTUR+UZEVkEfqGQopc4B0ERE3opnG5NFRN4VkfcA7E1QeUtEZCaAzYkoz1NQHR0EYKqI7BORPdA/qJF+F9IB1AAwU7SlANbDr9Olqo6WUlnQdW656BtKvAqgNoA6oRm9Uas+iNzRaQVgMIBxIrLH+91d7iVnANghIjsBfAKgqfeeod7rixO5USWh0VURXmtvFpQ6EBxWKEK5VnlFpMKUGSz3DQDNlR7vrwTgOuheVSxlha7jNwAuUko1hP7ibYL+gbhTRE7GuR3J0BLAKRH5d+C1VQDaAYBSKtPbh5mxFOb1+Ot7ZfysvGSI4TPbBdO8YdJNEdapHYDNIT3WYFm7veHJTtC97/3Qvd9bErApxaKIdTThq4HodTRcekOlVM3QgkRkF/RoxRilVAWlVC/oEZAvvSylrY6G84g31PqvkCHVQtXXgD8opfYppZYrpSKNJhXGBwAqKKV6eL3b6wGsBPBjmLyjoA+4tkQoqweAbQAe9LZ5TWAd90Af+DYEcCGAtUqp6tCjIHcnYDssJaHR3QBgN4CJ3nzIRdBHplVPZxCRM73eU6w+BPBHpdQZSqnm0DuragHvKcjHAPopPeFfGcA9ACoHyt0JPca/EcAx6OHm28IVBD0MUl8pNdzb5usANAuUdQeA30P3Fm8D0BtALoDNSqnZSqnPlVLD4tyeRKoO4GDIawcBnAEAIvK9tw+/L0R5p8v4WXlJUtBnRt3GMGVFyzsewJPQw10joff1pwDSlFLzlJ7r7IdSpAh1NBkKqqMfALhVKXWWNxx8+iAn0m/D6wAeAHAcum7fGxg2Lm11NNRd0D26BtDfw7lKqWZAkeoroA84WkD3Qu8H8LJSqnec65gL4B3oA53jALKhe6rhbqM4CsDLUcpqCH3wdRD64PomAK8opdqISD70vnwber/eAGAygGkAOnj1cZ5SKt6OG4AS0Oh6R4VXAPgV9BHM7QDeArA9jmJvgW74voWeL349WnkhE/IjIqznBuje61PQDWxtAOsC5WYD6A6gEYA0AA8CmK+U+lmFFpG9AC6Hnv/ZBT2398npskRkm4hcKiJdvfWfDP1l+F/oecTB0PNL6bH+QZLsMPRQXFAN6EpT1PJOlxFTeSEnVBT2CD2WzyzMNkbNKyIrRaS/iPSA/g5dD32SzYvQ35sxAGYqpcKNApVLCaqjf4KeZ18JfeD7HoCT0Af9oZ/XGrqujYJuuNtBz/H/yvus0lZHLSLylYjkeifqvQI9pXdpHOV9LSJ7RSRPRP4BPbd+ZaT8MdbXsdB1ox30PrgWwPtKqfohZf0SQD3oRjOSY9D7+mEROSEinwNYAOAib/0/FZGeItIPevTpbOhGfCb0FNND0PUzbsXe6AKAiKwWkX4ikiEiF0MfgS2Jo7x9IjJCROqJSDvo7YxYXsiEfMSzREXkbRFpLyIZ0I1sY/jzg52gz9Dc7n3xXgZQCxHmdUXkcxHpLiLp0L2dVhHW8QEAL3rDXR0ALBORg9A/JM2j/iHc+TeAit6JLKd1ArC2KIWJyH7oH81OgZejlif2CRyFOUKP9TPXBtO8eexmEdZpLYCmKnAWcpT1nwLgPhE5Bn//bgVQCcBZYfKXS4moo978+k0i0kBEmkLPTy+X8CfJtAewUUTmiUi+iGwE8H8ALgmTtzTU0YIIwk/1JaW8GOtrJwBzRZ8tnC/6rOad0OfEBF0H4F0ROfyzEnyrY1lp70D3KeiOW20AFURkG/R3qGMsZRSkRDS6SqmOSqk0pU/pvgPALxB9qKCg8poppTK8uZhLoM+IjvsaR6VUN6/Ms6DPapzrHV0DeqcMU0rVVUqlKKVGQv9wfhehrC7e0HIN6KPj7SIyLyRPWwD9ATzrvbQFwAClVF3ooZxCNy7J4M1vvgtgslKqmjesdDkinNQQo1ehzwqt5fU6bkAc34nTlFJpAFK9xVRvOZbPzAHQXil1lfeeBwCsDux/w5vbXgkg2/teD4GusO+ErMuFANJE5H3vpdP7t523jgk5aSkRlFIVve2uAD3Plqb8s4KLUl6KV14lvajSvCHheNczYh1VSjVQStVXWk/oYdDsCEWtANBC6cuGlDf0ehnsOf9SU0eDlL407eLT+9AbOegLYF5B741S5lClVHVvv14E3SudE+eqLgXwK6VUU28fXAh9/sg3gc+tAj2V93IBZf0Tel/c7W1zb+j9FrrNYwGsEJGV0PWvirePz0OiTvoTkWL/B33pzH7oYbkPADQPST8MoE+E904C8FrIa7+GvsThKPSP38WxvC8kXcKsx5fQQ4T7oCt0tUBaGvRlMzsBHALwNYCBgfTnADwXWH4den7hIPRwVJ0w67AAQI/Acifo4bL/Qp/GHvP2ONiH6dDDdUegv9zXBNIyvX2YGeG9L0MP+wRfS4W+pOQQ9BD8hDDv+wzA2Ahl9oc+kAm3X61/sX4mgAugz0E45n12VpT9m+XlOQY9z39BmO1bCaBx4LXzAWz1vkNXF/Q3crx/J4X5200KpBe2jvYPU95nhflOo/B1tK/39z3q7ZMRIe/9AMA9geVfQ//A50L3Wh8DkBLynlJTRwPrcRZ0g5YL4ACAxQAuDKQXpb5+Af1bdgj6wOTqMO/7DIWor9A95cnQvye50GePjwzJMxz6BCkVpsy1wX0MPUy9CPo3ah2AISH5a3v7u0bgtRHQ055bAZwX6/ZE/fsX9xcgAV+g+7w/4oFgBSvgPRu9L9WMKHl+8r5EDxX3NiZie0ryP+hLcw4D2BRj/hbe/j4KYHSEPH2hG7wDCHPQVVr+QTfOB7zveHZxr08Rt4F1tJTX0ZBtKdf1NZbtifaPz9MlIiJypETM6RIREZUHbHSJiIgcKfLZh0VxYcowjmUXk4/zZyX8mk/uz+KTjP0JcJ8WJ9bRsiXS/mRPl4iIyBE2ukRERI6w0SUiInKEjS4REZEjbHSJiIgcYaNLRETkCBtdIiIiR9joEhEROcJGl4iIyBE2ukRERI6w0SUiInKEjS4REZEjbHSJiIgccfqUISKiRPpuSk8Tb/rNc1baqG19Tbyr1yFn60SFkzegm4m3DPGbpNvP/4eVb1zNrSZOgf0An3z4D1PK3t3FxHO3trfy1X+kgr+wZE2R1jde7OkSERE5wkaXiIjIEQ4vU5lWsV5dEx/snWXiHRfaz/beMvivJj4pp6y03iuvNvGeH2qZuO2jP1r58rZ+H9e6UuH17rkuYtqrjf9p4j5DfmelVc35KmnrVF7tuOtca/lIixMmHt5tScT3PVjHr3v5yDdxSkifMJjW5rNxVlqdOakmPuPNxSauj8jfj+LCni4REZEjbHSJiIgc4fAylXoq1R9a2vxgVyvtqaEvmrhflaMRyzgp/vFncBgLAL7o/Hd/oXMgzLjeypc5LKbVpQQKDiFH85++9tmuzXOSsTbl26pbnrKWg2cU7zp1zMTP7LWHoVt+4A/9V/u2sonT/mtPAWVMX2TiZlgR38oWI/Z0iYiIHGGjS0RE5AgbXSIiIkc4pxviVH9/TrDiA7tMPLfVHCtfJeXf2STaJSYZ91Yysdq6w8q3d1BbE6e/942Vlp+bW5jVLte+n+jf0WbNyCeLVMaYbeebeHrjj2N6z8pzZ1jLg9G9SJ9Nydf8tsUFZ6K49F0z1Fqe3+FNEwfncZd3sft6LbEsuStWwrCnS0RE5AgbXSIiIkfK5fBy8BKT3MGdrbTsR/whw+AlJvZFJMDJwNns0S4x6Xr/aBN3qmcf48zO8k+x737mzVZa3WkLw688AQCkVycTz7h+WqHf3/GlW6zlJg99beLWU2600jZc/nShyycqb8684YS1/P6nGSa+4szlJl7Z5hor36n13yZ3xUoY9nSJiIgcYaNLRETkCBtdIiIiR8rlnO7x/h1MPP+JpyLmW3CsuokfeNi+5V+loxKa3TjU2D+WqRy48+Cdd9iXmBzMzzNx9Z32ZUdkC87hAoA8vM/E3fwp+p/NveccrmPiGaMHmzjrK/upJ5Lv//1b3bbKSrvkvd+b+KHn/CeinJ1q77MLvvEv8/qk/Rmhm0BJ0OzN8SYOfYh9UPBh9wAvIUqGvB+2W8t/zBlh4nXX+r+zJ+rZdaPC+uSuV0nDni4REZEjbHSJiIgcKTfDy8HhyUeefT5ivuGbLjXxoexGJq61YFG47GHVbN7ExJ1nbTJxm8r2MU7r2beZuOXbfKh2NLu7V7OWl7b2h+qDdwc7mG9ftpD9ln93sKxFse1DOX7cWq70kX/HnGvn+cOZawfZUxMT0/19/cLr11lpTYbbQ9aUGNGGlKmYBR7slBJY2NsuzcqWrrohFqnL/EuLTh06FN+6FSP2dImIiBxho0tERORIuRle3n+v/xDl4Nmul2640spX4Y4afrziaxTFgW51TZxd562I+Rp9VKTiy6WUC/Zay8G7gAXvDjZm82ArX9b9sU8LxKLl7/2znqf9sp2VNiF9g4lHtF1qpS1EZRCVZRUbNbSWH73ibyYOPtB+8d32Q0lSAn2/YL1OCekT9l8zzMTHZ9l1L/iA+5KOPV0iIiJH2OgSERE5wkaXiIjIkTI7p7vljY7W8touL5l4e54/v5tyby0rn6xYXejPCj61CACa/886v/zAcU3wQekAUOU9+65IZKvYoL6Jb2/1SUzv2TyrhbVcF3sSuk5BM2ZfYC1PGLMhQk6isik4j3vpPPuyuMHV9ps4e3cXE8/d2t7KJ4vPDFv24Ku/tJYnNPV/A66YfMBKy5/szxkPHDnOxMHLjICScakRe7pERESOsNElIiJypMwOL49qaw/dBk9F35bnXxaExYUfTgbsIeWNT9g345+d6T/0PHgD/m2Pt7LyVQXvQhXN/l9mmnho9dkR8437ob+JGwTuAAYAeSge7avYN39f0nSAifM2b3W8NkTJcbizPwU0rqZdR/uu/rWJa1zi18v6WIdYLH/M7hOuatjHxPeNbWyl9Ry4xsQfzvQfSvL0gWZWvg/G+GVgyRoUB/Z0iYiIHGGjS0RE5EiZHV5OtArt7KHh9TfXNPGGQU+HZjeCz+Q9Y+EWK41P0I1uT1dVcCYAmx5tY+IqP5aMM8Ivq2bfQesvZ9czcXUOLzvH5+cmR9pcv75dNtd+cEENbArNHpe87TtMnDlph5X2n0l+3OWum00cegb0Q2/6D0q5+7fjrbSK85cnYC0Lxp4uERGRI2x0iYiIHGGjS0RE5EiZndN9Z0tna3lihn96eJfUIybus/qnmMo7p+q71vJ5Vfz35YdmDrh91VATN9y1NqbPIu1U1chPHAkqKXf2qqQqmDj45CMicqfBYwtNvOpvjay0X8w7aOLJL75gpd36pxtNnMynFrGnS0RE5AgbXSIiIkfK7PByvWvtU8oHvzfExO+39u+cEhx2Low+gdPS84fbl4d80fnvJq7zQtUilU9Ax45bTZwfdRC/ZDgp/kVgpWF9icq64GVGADDrnotNvHOSfRnZM/dNNfF1jW41ceakhUgk9nSJiIgcYaNLRETkCBtdIiIiR8rsnG5+bq79wvn+8oAhfzDx7m6Rjztqrfev+6j5N3v8f8/M4ybe0PkNK236wSwTV12708TF9cQbcm9b3glrucqeExFyEpErVWb7lxeuWh75cqKVNzxp4sGTuid0HdjTJSIicoSNLhERkSNldng5mqo5/sPjvSFl3QAABPpJREFUs3KKVsaGAS+aOPTykKc39jNx/R9ie2AzlT5jr/goYtrlL020ljMXJPayA9JGbetr4lcb/zNivu+m9LSW+dQhCr2caOqq80w8vt/mpH0ue7pERESOsNElIiJypFwOLxdF6EPsAf+Bx6FnqtadmuZgjcq+Iw/UN/GylypYaWen+nd/+n5WBxNnDivaHcaKonuVLdbykuPKxFmPr7LSeH8qohLmnA7W4sye00389IFmSftY9nSJiIgcYaNLRETkCBtdIiIiRzinG6PN2ZUjpg1bMdZarrfg62SvTrmQ8vkKE9/4xE1W2tK7ppn44x7Pmnj0ebdY+SokeF9seaOjiXunLbfSzl0x3MTpR/6d0M8l39EhPUz8auPni3FNKGjbg+day2n/9eO600rGJXMV2rY08aHJR6y0hhWPmfjD0X0CKYk9T4Q9XSIiIkfY6BIRETnC4eUopFcnE8/p8UxIqn9ZkPq0lqM1Kr9+8dk+a/nsAdeaeFn310y8vb99uVbjBfF/9pGr/OHMt3r4D7pedDzVypf+MC8Vc6HJneuLexXIs/e3vUy8Zuw0K63NZ/60W107KW4VGzW0lrddkxk2X9NL7TtL3dPodRMvPmZfFjRkkn8XufSli+JdxYjY0yUiInKEjS4REZEjbHSJiIgc4ZxuFLu7VzNxk4r2fF3wyUIVfxJQcuWv3mAtN7jXvy1nTk66ieeMftzKN7D2BBO3uPErRKK6tTPxrl41rbTnb/cfaN2msn+c2nruOCtfy8VLQIkXvEQIiP0yoT43/s7EzXP4VKFkq6TsW7Wu7+8/iW3FFv/38ppFN1j5VCDu2/Q7E288UMfKt6DDLBOnwL4UMB8SSPNLfOZAEyvf8Pn+d6LtpJ1WWvr25M3jBrGnS0RE5AgbXSIiIkc4vBzFT7X9IYvQB9U/sa+tiTNecDMsQb5Tazea+JWB/sOnn/+rvZ8+vOwvJn6rTzcTv/H3AVa+F8f51zR0SY38TKCB64aauPWzuVYanyTkXrM3x5s49MH0VRF5OoESI2O6/9t37pHxVtruQcfDvueVXtOt5XNS/d/Z4NN98q2BZ/sSpPy99h0Cm+acDPtZlZd/Zy23PLTMxHlh35F87OkSERE5wkaXiIjIEQ4vR3HtFZFvZzRj9gUmzgKHl4tT3uatJk4dfpaVNr7LrSaudNePJl5+85NWvtZzb4xYfpN3/YHj1AWrTZx/8kSh15UKr2qOPUx8cU5nEzcHz0ouKc54Y3HIcvh8k9E1xhLt6ZtmWBEhX2SnCv2O5GNPl4iIyBE2ukRERI6w0SUiInKEc7pRvLPFnzuamJHYBxlTcpzas8darvRRYPkjPxyM7la+lojtblK89xgRxYM9XSIiIkfY6BIRETnC4eUo5FP/Rvr3NLRvul53WUk8GZ2IiEoy9nSJiIgcYaNLRETkCBtdIiIiRzinG0XdqQtN/M1UO61KjJeYEBERncaeLhERkSNsdImIiBxRIrzHDhERkQvs6RIRETnCRpeIiMgRNrpERESOsNElIiJyhI0uERGRI2x0iYiIHGGjS0RE5AgbXSIiIkfY6BIRETnCRpeIiMgRNrpERESOsNElIiJyhI0uERGRI2x0iYiIHGGjS0RE5AgbXSIiIkfY6BIRETnCRpeIiMgRNrpERESOsNElIiJyhI0uERGRI2x0iYiIHGGjS0RE5Mj/A9MQ19lekzQLAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./myckpt/')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
